package com.fjbdxk.beidou.bd;

/**
 * 配置和转换数据,将一个原始值转换为字节数组格式，并能够将从字节数组中恢复出原始值
 * 转换系数 data = (int) t / (weight - constant)
 * t = data * weight + constant
 */
public class TagConfig{
    final int byteCount; //数据的字节数,通常与数据的存储方式有关
    final double weight;   // 系数,用于在将数据从原始值转换为存储格式时进行缩放
    final double constant; // 常数,用于在将数据从原始值转换为存储格式时进行平移

    TagConfig(int byteCount, double weight, double constant) {
        this.byteCount = byteCount;
        this.weight = weight;
        this.constant = constant;
    }
    //将原始值转换为字节数组
    public byte[] convertToStore(double originalValue) {
        final int INT_BYTE_CNT = 4;
        int data = (int)(originalValue / weight - constant);
        byte[] intByte = new byte[INT_BYTE_CNT];//创建字节数组: intByte 数组包含 4 个字节（INT_BYTE_CNT），用来存储整数 data 的字节表示
        intByte[0] = (byte)(0xFF & data);//填充字节数组: 将 data 的四个字节逐一填充到 intByte 中（使用位运算），这里使用了按位与操作 (& 0xFF) 来确保每个字节的值在 0 到 255 之间。
        intByte[1] = (byte)(0xFF & (data >> 8));
        intByte[2] = (byte)(0xFF & (data >> 16));
        intByte[3] = (byte)(0xFF & (data >> 24));

        //反转字节顺序: 创建一个新的字节数组 buf，它的大小等于 byteCount。然后将 intByte 中的字节反转存入 buf 中
        byte[] buf = new byte[byteCount];
        for (int i=0; i<byteCount; ++i) {
            buf[i] = intByte[byteCount - 1 - i];
        }

        return buf;
    }
    //将一个整数 data 转换回原始值
    public double convertToOriginal(int data) {
        return data * weight + constant;
    }
}
